package movepaint.view;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JProgressBar;
import javax.swing.Timer;

/**
 * Classe qui permet de créer une barre de statut.
 *
 * @author Paulino A.
 * @version 1.0
 **/
public class StatusBar extends JPanel {
	// Texte par défaut de la barre de status
	private final static String DEFAULT_TEXT = "Pret";
	
	// Temps d'attente du timer
	private final static int SLEEP_TIME = 600;
	
	// Panel qui contient la barre de progression et un Label
	//	indiquant l'action en cours
	JPanel _panelActionsUser = null;
	
	// Le label de la barre de statut.
	private JLabel _statusBarLabel = null;
	
	// La barre de progression qui in dique qu'une action est en cours
	private JProgressBar _progressBar = null;
	
	// Booleen qui indique si une action est en cours ou non
	private Boolean _isWork = false;

    // Timer qui va mettre à jour la barre de progression
    private Timer timer = null;

	/**
	 * Constructeur qui creer la barre de statut de l'application.
	 **/
	public StatusBar()  {
		// Initialisation du layout manager et des bordures
		setBorder(new BevelBorder(BevelBorder.LOWERED));
		setLayout(new BorderLayout());
		
		// On creer les composants
		createComponents();
		
		// On place les composants
		placeComponents();		

        // On démarre le Timer
        timer.start();
	}

	/**
	 *	Cette methode creer les composants de la fenetre
	 */
	private void createComponents() {
		// Creation du panel qui indique les actions de l'utilisateur
		_panelActionsUser = new JPanel();
		
		// Initialisation du label
		_statusBarLabel = new JLabel(DEFAULT_TEXT);
		
		// Initialisation de la barre de progression
		_progressBar = new JProgressBar();

        // Creation du Timer mettant à jour la barre de progression
        timer = createTimer();
	}

	/**
	 *	Cette methode place les composants de la fenetre
	 */
	private void placeComponents() {
		// Gestionnaire d'agencement du panel d'action de l'utilisateur
		_panelActionsUser.setLayout(new FlowLayout(FlowLayout.LEADING,5,5));

		// Ajout des composants au panel d'action de l'utilisateur
		_panelActionsUser.add(_progressBar);
		_panelActionsUser.add(_statusBarLabel);


		// Ajout du panel d'action a la barre de statut
		add(_panelActionsUser,BorderLayout.WEST);

		// Ajout du panel de gestion de la memoire
		add(new UsedMemoryPanel(),BorderLayout.EAST);
	}

    /**
     * Méthode renvoyant un timer prêt à démarrer
     */
    private Timer createTimer() {
        // Création d'une instance de listener associée au timer
        ActionListener action = new ActionListener() {

            // Méthode appelée à chaque tic du timer
            public void actionPerformed(ActionEvent event) {
                if (isWork()) {
                    if (SwingUtilities.isEventDispatchThread ())
                        _progressBar.setIndeterminate(true); // Mode indeterminé
                    else
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                _progressBar.setIndeterminate(true);
                            }
                        });
                } else {
                    if (SwingUtilities.isEventDispatchThread ()) {
                            _progressBar.setIndeterminate(false); // Mode determiné
                            setStatusText(DEFAULT_TEXT);
                    } else
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            _progressBar.setIndeterminate(false); // Mode determiné
                            setStatusText(DEFAULT_TEXT);
                        }
                    });
                }
             }
        };

        // Création d'un timer qui génère un tic
        // chaque SLEEP_TIME millième de seconde
        return new Timer(SLEEP_TIME, action);
    }
	
	/**
	 * Methode qui modifie le texte de la barre de statut.
	 * 
	 * @param newLabel
	 * 			Le nouveau texte à afficher dans la barre de statut.
	 **/
	public void setStatusText(String newLabel){
		_statusBarLabel.setText(newLabel);
	}


	/**
	 *	Permet de savoir si une action est en cours
	 *
	 *	@return
	 *			<b>true</b> si une action est en cours, <b>false</b> sinon
	 **/
	public synchronized Boolean isWork() {
		return _isWork;		
	}

	/**
	 *	Définit si une action est en cours ou non
	 *
	 *	@param isWork
	 *			<b>true</b> si une action est en cours, <b>false</b> sinon
	 **/
	public synchronized void isWork(Boolean isWork) {
		_isWork = isWork;
	}
}
